package org.candan.spider.task;

import java.io.File;
import java.io.FileFilter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.log4j.Logger;
import org.candan.spider.bean.Plan;
import org.candan.spider.bean.Task;
import org.candan.spider.task.xml.XMLProperty;
import org.candan.spider.util.DateUtil;
import org.candan.spider.util.SLog;


public class Container {
	public static Map<String,Task> tasks = new HashMap<String,Task>();
	public static Map<String,Plan> plans = new HashMap<String,Plan>();
	public static ITaskService TaskOp = Adapter.instanceTask(Adapter.XML_STRATEGY);
	public static IPlanService PlanOp = Adapter.instancePlan(Adapter.XML_STRATEGY);
	private Timer planTimer = new Timer();
	
	private static Logger planLog = new SLog("任务容器").getLogger();  
//	public void init(){
//		TaskOp.init();
//	}
	
	/**
	 * @category 更新计划
	 * @param plan
	 */
	public static void updatePlan(Plan plan){
		PlanOp.modifyPlan(plan);
		if (plan.getStatus().equals(XMLProperty.STATUS_FINISH)) {
			plans.remove(plan.getId());
		}
		planLog.info("容器中计划个数："+plans.size());
	}
	/**
	 * @category 容器添加计划
	 * @param plan
	 */
	public static void putPlan(Plan plan){
		if(plans.containsKey(plan.getId()))return;
		plans.put(plan.getId(), plan);
	}
	
//	/**
//	 * @category 查看有木有正在运行的同样任务
//	 * @param plan
//	 * @return
//	 */
//	public static boolean haveSameRunPlan(Plan plan){
//		for(Map.Entry<String, Plan> m: plans.entrySet()){
//			if(m.getValue().getUrl().equals(plan.getUrl()) && m.getValue().getStatus().equals(XMLProperty.STATUS_BEGIN)){
//				return true;
//			}
//		}
//		
//		return false;
//	}
	
	/**
	 * @category 释放文件锁-系统启动时
	 * @param dir
	 * @return
	 */
	public static File[]  releaseFileLock(String dir){
		File[] files = new File(dir).listFiles(new FileFilter() {
			@Override
			public boolean accept(File fl) {
				if(fl.getName().endsWith(".LOCK"))return true;
				return false;
			}
		});
		
		for(File f: files){
			f.delete();
		}
		return files;
	}
	
	/**
	 * @category 释放所有任务的文件锁
	 * @return
	 */
	public boolean releaseFileLocks(){
		for(Map.Entry<String,Task> map : tasks.entrySet()){
			releaseFileLock(map.getValue().getOutput());
		}
		return true;
	}
	/**
	 * @category 今天计划-项目启动时使用
	 */
	public void generateTodayPlan(){
		planLog.info("==================启动工程====================");
		// 启动工程时，从此时刻创建今天的任务，并运行
		planLog.info("启动工程-启动今天任务-generateTodayPlan");
		PlanOp.createDayPlans(tasks, new Date(),false);
		PlanOp.initPlan(new Date());
		releaseFileLocks();
		PlanOp.runPlans(plans);
	}
	
	/**
	 * @category 今晚凌晨开始生成明天计划
	 */
	public void generateTomorrowPlan(){
		planLog.info("启动工程-启动每天任务-generateTomorrowPlan");
		//从今天23:59:00时刻开始，每天这个时刻，生成第二天的计划列表
		Date date = DateUtil.getTomorrowZeroDate();
//		Date date = Util.getTodayZeroDate();
		date.setTime(date.getTime() -60000);
		planTimer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				PlanOp.createDayPlans(tasks, DateUtil.getTomorrowZeroDate(),true);
				PlanOp.initPlan(DateUtil.getTomorrowZeroDate());
				PlanOp.runPlans(plans);
			}
		},date, 24 * 3600 * 1000);
	}
	
	/**
	 * @category 启用的计划个数
	 * @return 
	 */
	public int getPlanNum(){
		return tasks.size();
	}
	

//	/**
//	 * @category 启动所有可运行任务
//	 * @return
//	 */
//	public boolean startAllTask(){
//		for(Task task : Container.tasks.values()){
//			startTask(task);
//		}
//		return true;
//	}
//	
//	/**
//	 * @category 启动任务
//	 * @param task
//	 */
//	public void startTask(Task task){
//		task.getTimer().scheduleAtFixedRate(new SpiderTask2(task), getTaskRunDate(task), task.getInterval());
//	}
	/**
	 * @category 停止任务
	 *                    如果修改任务的参数，须先停止任务
	 * @param id
	 */
	public void enableTask(String id){
		
	}
	
//	public Boolean addTask(Task task){
//		
//	}
	
	/**
	 * @category 创建任务
	 * @param id
	 * @param values
	 */
	public void  createTask(Task task){
		TaskOp.createTask(task);
	}
	
	 /**
	  * @category  删除任务
	 * @param id
	 */
	public void deleteTask(String id){
		TaskOp.deleteTaskByID(id);
	}
	
	/**
	 * @category 修改任务
	 * @param id
	 * @param values
	 */
	public void modifyTask(Task task){
		TaskOp.modifyTask(task);
	}
	
	/**
	 * @category 查询任务
	 * @param id
	 * @return
	 */
	public Task findTaskByID(String id){
		return TaskOp.searchTaskByID(id);
	}

	/**
	 * @category 查询任务
	 * @param id
	 * @return
	 */
	private int findTaskIndexOfRun(String id){
		for(int i = 0; i < tasks.size(); i++){
			if(tasks.get(i).getId().equals(id)){
				return i;
			}
		}
		return -1;
	}
	
	/**
	 * @category 查询某运行任务
	 * @param id
	 * @return
	 */
	private Task findTaskOfRun(String id){
		return tasks.get(id);
	}
	
		
	
	
	/**
	 * @category 任务开始运行时间-启动任务时计算
	 * @param task
	 * @return
	 */
	public Date getTaskRunDate(Task task){
		Date curDate = new Date();
		if(task.getStartTime().after(curDate)){
//			getTaskRunInterval(task);
			return task.getStartTime();
		}
		curDate.setTime(task.getStartTime().getTime() + 
		((curDate.getTime() - task.getStartTime().getTime())/task.getInterval()+1)
		* task.getInterval());
		return curDate;
	}
	
	public long getTimes(String space){
		String[] step1 = space.split("^ +$");
		return 0;
	}
	
	/**
	 * @category 今天运行任务总数
	 * @return 
	 */
	public int getTaskNumToday(){
		return 0;
	}
	
	
	/**
	 * @category 今天失败的任务个数
	 * @return 
	 */
	public int getFailTaskNumToday(){
		return 0;
	}
	
	/**
	 * @category 今天完成的任务个数
	 * @return 
	 */
	public int getFinishTaskNumToday(){
		return 0;
	}
	
//	public void getStatus(String status){
//	//	String status=new SpiderTask().isRunning;
//		if(status.equals("stop")){
//		}else if(status.equals("begin")){
//		}else if(status.equals("end")){
//		}
//		
//	}
	/**
	 * @category 查询所有任务或单个任务状态
	 * @param 
	 * @return
	 */
	public List<Task> find(String... id){
		return TaskOp.searchTasks();
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Container con = new Container();
//		con.init();
		con.generateTomorrowPlan();
		con.generateTodayPlan();
		
	}

}
